package com.black.utils.office.excel;

import com.black.utils.file.FileTypeEnum;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.List;

/**
 * @author ylx
 */
@Slf4j
public class ExcelConverter {
    /**
     * 将Excel文件转换为其他格式的文件。
     * 此方法首先判断源文件是否为HTML格式，如果是，则抛出异常，因为不支持从HTML格式转换。
     * 然后加载Excel文件的数据，提取第一行作为表头信息，并根据表头信息生成对应的ExcelHeader对象列表。
     * 最后，使用ExcelExportUtil将表头和数据导出到目标文件中。
     *
     * @param sourceFile 源Excel文件的路径。
     * @param targetFile 目标文件的路径，即转换后的文件保存位置。
     * @throws RuntimeException 如果源文件格式为HTML，则抛出异常。
     */
    public static void convert(String sourceFile, String targetFile) throws IOException
    {
        // 如果源文件是HTML格式，则抛出异常
        if (FileTypeEnum.HTML.is(sourceFile)) {
            throw new RuntimeException("不支持从HTML向其他类型转换; Unsupported convert from html to others");
        }
        // 加载源Excel文件的数据
        log.info("Load from {} ;Column numbers are used as headers for data reading", sourceFile);
        List<ExcelEntity> data = ExcelLoadUtil.load(sourceFile);
        // 使用表头列表和数据表，导出到目标文件
        ExcelExportUtil.export(data, targetFile);
        log.info("Exported to {}", targetFile);
    }

    /**
     * 转换源文件到目标文件，同时包含标题行。
     * 此方法是convertWithHeader方法的重载版本，它默认从源文件的第0行开始转换。
     * 主要用于在文件转换过程中，保持原有的表头行。
     *
     * @param sourceFile 源文件路径，即要转换的原始文件。
     * @param targetFile 目标文件路径，即转换后的文件将保存的位置。
     */
    public static void convertWithHeader(String sourceFile, String targetFile) throws IOException{
        convertWithHeader(sourceFile, targetFile, 0);
    }


    /**
     * 将源文件转换为目标文件格式，前提是源文件不是HTML格式。
     * 该方法支持从Excel文件转换为其他格式，利用ExcelLoadUtil加载带有标题的Excel内容，
     * 并通过ExcelExportUtil将其导出到目标文件。
     *
     * @param sourceFile    源文件路径，支持Excel格式。
     * @param targetFile    目标文件路径，将导出的内容存储于此。
     * @param lastHeaderRow 最后一行包含标题的行号，用于正确加载Excel内容。
     * @throws RuntimeException 如果源文件格式为HTML，则抛出异常，表示不支持从HTML到其他格式的转换。
     */
    public static void convertWithHeader(String sourceFile, String targetFile, int lastHeaderRow) throws IOException{
        // 检查源文件是否为HTML格式，如果是，则抛出异常
        if (FileTypeEnum.HTML.is(sourceFile)) {
            throw new RuntimeException("不支持从HTML向其他类型转换; Unsupported convert from html to others");
        }
        // 从源文件加载带有标题的Excel数据
        log.info("Load from {} ;Parse table headers for data reading", sourceFile);
        List<ExcelEntity> data = ExcelLoadUtil.loadWithHeader(sourceFile, lastHeaderRow);
        // 使用Excel实体的标题和数据导出到目标文件
        ExcelExportUtil.export(data, targetFile);
        log.info("Exported to {}", targetFile);
    }
}
